package main

import (
	"fmt"
	"time"
)

// 用两个 chan 将 3 个函数连接起来

func main() {
	naturals := make(chan int)
	squares := make(chan int)

	// 产生数字序列
	go func() {
		for x := 0; x < 2 ;x++ {
			naturals <- x
			time.Sleep(1*time.Second)
		}
		close(naturals)
	}()

	go func() {
		for {
			x, ok := <- naturals
			if ok {
				squares <- x * x
			} else {
				break
			}
		}
		close(squares)
	}()

	// 这里要想正常结束 必须要用 Range ???
	// Range 会在 chan close 跳出循环, 等价于 自己检查是否成功的从 chan 中取出了值, 如上所示
	for x := range squares {
		fmt.Println(x)
	}
}

